Implementacja w MATLABie problemu projekcji bitmapy
W module tym przedstawiamy dwa kody MATLABa obliczające izogeometryczną L2 projekcję bitmapy. Kody używają izogeometrycznej metody elementów skończonych, w której to bitmapa aproksymowana jest za pomocą kombinacji liniowej wielomianów B-spline.
Wykonanie kodu\ów możliwe jest również w darmowym środowisku Octave.
Pobierz kod 1 lub zob. Załącznik 1.
Pobierz kod 2 lub zob. Załącznik 1.
W celu uruchomienia kodów zapisujemy je w katalogu roboczym Octave.
Ustawiamy zmienne ze ścieżką do pliku wejściowego w formacie tif
\( filename = 'C://Users/Maciej/Dropbox/bitmapa.tif' \)
następnie podajemy ilość elementów siatki w kierunku osi x i y oraz stopnie funkcji B-spline w tych kierunkach
\( nx=4 \)
\( ny=4 \)
\( px=2 \)
\( py=2 \)
Następnie uruchamiamy pierwszą procedurę
\( bitmap\_param(filename,nx,ny,px,py) \).
Kod po zbudowaniu układu równań i rozwiązaniu go rysuje projekcje bitmapy w otwartym okienku.
Pierwszy kod oblicza izogeometryczną L2 projekcję bitmapy, generuje wartości funkcji B-spline zgodnie z rekurencyjnej definicji. Podczas całkowania, oblicza on kwadratury Gaussa na
\( (Ne_x+px)(Ne_y+py) \) elementach, próbkując wartości funkcji B-spline. Woła on funkcje rekurencyjne wiele razy dla wielu punktów kwadratury Gaussa.
Przez to jest on bardzo wolny. Nawet dla 4*4=16 elementów działa ona stosunkowo długo, a zwiększenie liczby elementów zwiększa czas działania programu tak, jak funkcja kwadratowa liczby elementów.
Dlatego zaproponowaliśmy drugą procedurę
\( bitmap\_fast(filename,nx,ny,px,py) \), w której w tablicy umieszczono przeliczone wcześniej wartości funkcji B-spline, w kierunku osi poziomej i pionowej. Zamiast liczyć je na \( (Ne_x+px)(Ne_y+py) \) elementach, czytamy ich wartości z tablicy. Operacja ta przyspiesza działanie kodu o 2 rzędy wielkości.
Żeby bardziej przyspieszyć kod konieczne jest zastąpienie MATLABowej procedury backslash (\ stosowanej do rozwiązania wygenerowanego układu równań) solwerem zmienno-kierunkowym.